iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
自我挑戰組

leetcode 30天 不中斷解題挑戰系列 第 14

Day14 leetcode隨機挑題 (Linked List、Matrix、Dynamic Programing

  • 分享至 

  • xImage
  •  

首先是 19. Remove Nth Node From End of List (medium)
https://leetcode.com/problems/remove-nth-node-from-end-of-list/

給一個linked list: head,再給一個n,必須從這linked list裡刪除倒數第n個的node點。

這題滿簡單的
想法:
可以複製一個temp跟ans的linkedlist,然後head先跑到第n個位置上
接著讓temp跟head一起跑,當head跑到終點時,該位置即為要刪除的點位,
把該點為略過temp.next = temp.next.next,就可以把ans回傳了。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        ans = temp1 = head
        while n:
            head = head.next
            n-=1
        if head is None:
            return ans.next
        while head.next:
            temp1 = temp1.next
            head = head.next
        temp1.next = temp1.next.next
        return ans

接下來是 200. Number of Islands (medium)
https://leetcode.com/problems/number-of-islands/

會給一個mxn的matrix,檢查'1'的區塊共有多少個。

想法:

  1. 跑圖類型的基本上就是dfs跟bfs
  2. 紀錄已經跑過的地方,已經跑過的就變成其他的值紀錄
  3. 當四周不是'1'的時候就代表這區塊算完了
class Solution:
    #檢查1的區域有哪幾塊
    #會想到走迷宮的題目 -> DFS or BFS
    #這題比想像中的簡單
    #簡單來說就是紀錄已經跑過的地方,找到'1'的時候就檢查他的四周是否是'1',是的話改變他
    #函式跑完後就會把整塊陸地變成其他東西,代表跑完了,for loop在跑到該區塊時就不會檢查第二次
    def numIslands(self, grid: List[List[str]]) -> int:
        maxL,maxW = len(grid),len(grid[0])
        def dfs(grid,i,j):
            if i<0 or j<0 or i >=maxL or j >= maxW or grid[i][j] != '1':#跑出grid 或 跑到不是'1'時就不用跑了
                return
            grid[i][j] = "-"#代表跑過了
            #往上下左右去跑
            dfs(grid,i+1,j)
            dfs(grid,i-1,j)
            dfs(grid,i,j+1)
            dfs(grid,i,j-1)
        ans = 0
        for i in range(maxL):
            for j in range(maxW):
                if grid[i][j] == '1':
                    dfs(grid,i,j)
                    ans+=1 #跑完一次加1
        return ans

接下來是 509. Fibonacci Number(easy)
https://leetcode.com/problems/fibonacci-number/

超級基本題,算出費伯納器數列的第n個位置的值
當我看到這題的時候第一個看得是n會多大,結果只有30,寫個最簡單的遞迴都OK

class Solution:
    def fib(self, n: int) -> int:
        n = 30
        if n<=1:
            return n
        a,b = 0,1
        while n -1:
            a,b = b,a+b
            n-=1
        return b
    
    def fib(self, n: int) -> int:#這邊是我上面的東西算出來後,列表來跑速度用的
        L = [0,1,1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040]

        return L[n]

以上就是今天的練習,感謝大家觀看


上一篇
Day13 leetcode隨機挑題 (Dynamic Programming、Array)
下一篇
Day15 leetcode隨機挑題 (Binary Search、Heap、Dynamic programming)
系列文
leetcode 30天 不中斷解題挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言